/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.activiti.bpmn.model;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author Tijs Rademakers
 */
public class UserTask extends Task {

	protected String assignee;
	protected String owner;
	protected String priority;
	protected String formKey;
	protected String dueDate;
	protected String businessCalendarName;
	protected String category;
	protected String extensionId;
	protected String type;
	protected List<String> candidateUsers = new ArrayList<String>();
	protected List<String> candidateGroups = new ArrayList<String>();
	protected List<FormProperty> formProperties = new ArrayList<FormProperty>();
	protected List<ActivitiListener> taskListeners = new ArrayList<ActivitiListener>();
	protected String skipExpression;

	protected Map<String, Set<String>> customUserIdentityLinks = new HashMap<String, Set<String>>();
	protected Map<String, Set<String>> customGroupIdentityLinks = new HashMap<String, Set<String>>();

	protected List<CustomProperty> customProperties = new ArrayList<CustomProperty>();
	
	/**
	 * 增加自定义属性
	 */
	protected String custonData;

	public String getAssignee() {
		return assignee;
	}

	public void setAssignee(String assignee) {
		this.assignee = assignee;
	}

	public String getOwner() {
		return owner;
	}

	public void setOwner(String owner) {
		this.owner = owner;
	}

	public String getPriority() {
		return priority;
	}

	public void setPriority(String priority) {
		this.priority = priority;
	}

	public String getFormKey() {
		return formKey;
	}

	public void setFormKey(String formKey) {
		this.formKey = formKey;
	}

	public String getDueDate() {
		return dueDate;
	}

	public void setDueDate(String dueDate) {
		this.dueDate = dueDate;
	}

	public String getBusinessCalendarName() {
		return businessCalendarName;
	}

	public void setBusinessCalendarName(String businessCalendarName) {
		this.businessCalendarName = businessCalendarName;
	}

	public String getCategory() {
		return category;
	}

	public void setCategory(String category) {
		this.category = category;
	}

	public String getExtensionId() {
		return extensionId;
	}

	public void setExtensionId(String extensionId) {
		this.extensionId = extensionId;
	}

	public boolean isExtended() {
		return extensionId != null && !extensionId.isEmpty();
	}

	public List<String> getCandidateUsers() {
		return candidateUsers;
	}

	public void setCandidateUsers(List<String> candidateUsers) {
		this.candidateUsers = candidateUsers;
	}

	public List<String> getCandidateGroups() {
		return candidateGroups;
	}

	public void setCandidateGroups(List<String> candidateGroups) {
		this.candidateGroups = candidateGroups;
	}

	public List<FormProperty> getFormProperties() {
		return formProperties;
	}

	public void setFormProperties(List<FormProperty> formProperties) {
		this.formProperties = formProperties;
	}

	public List<ActivitiListener> getTaskListeners() {
		return taskListeners;
	}

	public void setTaskListeners(List<ActivitiListener> taskListeners) {
		this.taskListeners = taskListeners;
	}

	public void addCustomUserIdentityLink(String userId, String type) {
		Set<String> userIdentitySet = customUserIdentityLinks.get(type);

		if (userIdentitySet == null) {
			userIdentitySet = new HashSet<String>();
			customUserIdentityLinks.put(type, userIdentitySet);
		}

		userIdentitySet.add(userId);
	}

	public void addCustomGroupIdentityLink(String groupId, String type) {
		Set<String> groupIdentitySet = customGroupIdentityLinks.get(type);

		if (groupIdentitySet == null) {
			groupIdentitySet = new HashSet<String>();
			customGroupIdentityLinks.put(type, groupIdentitySet);
		}

		groupIdentitySet.add(groupId);
	}

	public Map<String, Set<String>> getCustomUserIdentityLinks() {
		return customUserIdentityLinks;
	}

	public void setCustomUserIdentityLinks(Map<String, Set<String>> customUserIdentityLinks) {
		this.customUserIdentityLinks = customUserIdentityLinks;
	}

	public Map<String, Set<String>> getCustomGroupIdentityLinks() {
		return customGroupIdentityLinks;
	}

	public void setCustomGroupIdentityLinks(Map<String, Set<String>> customGroupIdentityLinks) {
		this.customGroupIdentityLinks = customGroupIdentityLinks;
	}

	public List<CustomProperty> getCustomProperties() {
		return customProperties;
	}

	public void setCustomProperties(List<CustomProperty> customProperties) {
		this.customProperties = customProperties;
	}

	public String getSkipExpression() {
		return skipExpression;
	}

	public void setSkipExpression(String skipExpression) {
		this.skipExpression = skipExpression;
	}

	public String getCustonData() {
		return custonData;
	}

	public void setCustonData(String custonData) {
		this.custonData = custonData;
	}


	public UserTask clone() {
		UserTask clone = new UserTask();
		clone.setValues(this);
		return clone;
	}

	public void setValues(UserTask otherElement) {
		super.setValues(otherElement);
		setAssignee(otherElement.getAssignee());
		setOwner(otherElement.getOwner());
		setFormKey(otherElement.getFormKey());
		setDueDate(otherElement.getDueDate());
		setPriority(otherElement.getPriority());
		setCategory(otherElement.getCategory());
		setExtensionId(otherElement.getExtensionId());
		setSkipExpression(otherElement.getSkipExpression());

		setCandidateGroups(new ArrayList<String>(otherElement.getCandidateGroups()));
		setCandidateUsers(new ArrayList<String>(otherElement.getCandidateUsers()));

		setCustomGroupIdentityLinks(otherElement.customGroupIdentityLinks);
		setCustomUserIdentityLinks(otherElement.customUserIdentityLinks);

		setCustonData(otherElement.getCustonData());
		formProperties = new ArrayList<FormProperty>();
		if (otherElement.getFormProperties() != null && !otherElement.getFormProperties().isEmpty()) {
			for (FormProperty property : otherElement.getFormProperties()) {
				formProperties.add(property.clone());
			}
		}

		taskListeners = new ArrayList<ActivitiListener>();
		if (otherElement.getTaskListeners() != null && !otherElement.getTaskListeners().isEmpty()) {
			for (ActivitiListener listener : otherElement.getTaskListeners()) {
				taskListeners.add(listener.clone());
			}
		}
	}
}
